export function createStore(reducer) {
    let state = reducer(undefined, { type: '@@REDUX_INIT' });
    let listeners = [];

    function getState() {
        return state
    }

    function subscribe(listener) {
        listeners.push(listener)
        // 销毁时只注销本身
        return () => {
            listeners = listeners.filter(l => l !== listener)
        }
    }

    // 这样已经可以很好的处理异步action了
    // 但是，用户可能还有很多的个性化需求，比如：
    // 1. 记录日志
    // 2. 取消重复的请求
    // 请求超时处理
    // 请求错误重试
    // 多个异步操作的协调
    // 缓存结果
    // 此时，中间件可能就派上用场了，让这些功能都独立出来，用户可以自由选择组合，而dispatch不需要关心这些，只需要无脑顺序执行就好
    function dispatch(action) {
        const actionType = typeof action

        if (actionType === 'function') {
            return action(dispatch);
        }

        if (action instanceof Promise) {
            return action.then(dispatch);
        }

        state = reducer(state, action)
        listeners.forEach(listener => listener())
    }

    return {
        getState,
        dispatch,
        subscribe,
    }
}
